<?php
require_once 'Zend/View/Interface.php';
require_once 'Smarty.class.php';

class Mf_View_Smarty extends Zend_View_Abstract implements Zend_View_Interface
{
	/**
	 * Smarty object
	 * @var Smarty
	 */
	protected $_smarty;

	/**
	 * Constructor
	 *
	 * @param string $tmplPath
	 * @param array $extraParams
	 * @return void
	 */
	public function __construct($tmplPath = null, $extraParams = array())
	{
		$this->_smarty = new Smarty();

		if (null !== $tmplPath) {
			$this->setScriptPath($tmplPath);
		}

		foreach ($extraParams as $key => $value) {
			$this->_smarty->$key = $value;
		}
	}

	/**
	 * Return the template engine object
	 *
	 * @return Smarty
	 */
	public function getEngine()
	{
		return $this->_smarty;
	}

	/**
	 * Set the path to the templates
	 *
	 * @param string $path The directory to set as the path.
	 * @return void
	 */
	public function setScriptPath($path)
	{
		if (is_readable($path)) {
			$this->_smarty->template_dir = $path;
			return;
		}

		throw new Exception('Invalid path provided');
	}

	/**
	 * Retrieve the current template directory
	 *
	 * @return string
	 */
	public function getScriptPaths()
	{
		return array($this->_smarty->template_dir);
	}

	/**
	 * Alias for setScriptPath
	 *
	 * @param string $path
	 * @param string $prefix Unused
	 * @return void
	 */
	public function setBasePath($path, $prefix = 'Zend_View')
	{
		return $this->setScriptPath($path);
	}

	/**
	 * Alias for setScriptPath
	 *
	 * @param string $path
	 * @param string $prefix Unused
	 * @return void
	 */
	public function addBasePath($path, $prefix = 'Zend_View')
	{
		return $this->setScriptPath($path);
	}

	/**
	 * Assign a variable to the template
	 *
	 * @param string $key The variable name.
	 * @param mixed $val The variable value.
	 * @return void
	 */
	public function __set($key, $val)
	{
		$this->_smarty->assign($key, $val);
	}

	/**
	 * Retrieve an assigned variable
	 *
	 * @param string $key The variable name.
	 * @return mixed The variable value.
	 */
	public function __get($key)
	{
		return $this->_smarty->get_template_vars($key);
	}

	/**
	 * Allows testing with empty() and isset() to work
	 *
	 * @param string $key
	 * @return boolean
	 */
	public function __isset($key)
	{
		return (null !== $this->_smarty->get_template_vars($key));
	}

	/**
	 * Allows unset() on object properties to work
	 *
	 * @param string $key
	 * @return void
	 */
	public function __unset($key)
	{
		$this->_smarty->clear_assign($key);
	}

	/**
	 * Assign variables to the template
	 *
	 * Allows setting a specific key to the specified value, OR passing an array
	 * of key => value pairs to set en masse.
	 *
	 * @see __set()
	 * @param string|array $spec The assignment strategy to use (key or array of key
	 * => value pairs)
	 * @param mixed $value (Optional) If assigning a named variable, use this
	 * as the value.
	 * @return void
	 */
	public function assign($spec, $value = null)
	{
		if (is_array($spec)) {
			$this->_smarty->assign($spec);
			return;
		}

		$this->_smarty->assign($spec, $value);
	}

	/**
	 * Clear all assigned variables
	 *
	 * Clears all variables assigned to Zend_View either via {@link assign()} or
	 * property overloading ({@link __get()}/{@link __set()}).
	 *
	 * @return void
	 */
	public function clearVars()
	{
		$this->_smarty->clear_all_assign();
	}

	/**
	 * Processes a template and returns the output.
	 *
	 * @param string $name The template to process.
	 * @return string The output.
	 */
	public function render($name)
	{
		return $this->_smarty->fetch($name);
	}
	public function display()
	{

	}
	protected function _run ()
	{
		// include func_get_arg(0);
	}

}
